<?php

/**
 * 请求参数操作类(接收参数并验证)
 * @author  hugang
 */
class validata
{
    private $all_data;//最终接受的参数的集合
    private $form_param = '';//要接受的参数
    private $real_param = '';//实际接受的参数
    private $check_rule = array();//验证规则，多个规则用,隔开
    private $check_tips = array();//验证提示，多个规则用,隔开

    /**
     * @param array $data 验证的参数
     * @return  接受参数并验证
     */
    public function check(array $data)
    {
        if (!is_array($data[0])) return false;
        foreach ($data as $ke => $val) {
            /*--------------参数的------------*/
            $data = explode(',', $val[0]);//$val[0] 就是接受参数
            //要接受的参数
            if ($data[0]) {
                $this->form_param = $data;
            } else {
                msg_no('接受必须参数不存在');
            }
            //默认参数

            /*--------------参数的------------*/
            //验证规则--------
            if (isset($val[1])) {
                $data = explode(',', $val[1]);//$val[1] 就是验证规则
                if (isset($data)) {
                    $this->check_rule = $data;
                }
            }
            //验证规则--------
            //提示的=========
            if (isset($val[1]) && isset($val[2])) {//有规则才有提示
                $data = explode(',', $val[2]); // $val[2] 就是验证提示
                $this->check_tips = $data;
            }
            //提示的=========

            //对参数进行接受
            $this->real_param = $this->getParam();
            //参数验证
            foreach ($this->check_rule as $key => $value) {
                if (!method_exists($this, $value)) {
                    return 'PHP内部验证方法不存在:' . $value;
                }
                $check_res = $this->$value($this->real_param);
                if ($check_res == false) {
                    msg_no($this->form_param[0] . $this->check_tips[$key], '参数校验不通过');
                }
                $this->all_data[$this->form_param[0]] = $this->real_param;//检验合格保存值
            }
        }
        return $this->all_data;//返回接受的参数
    }

    //接受指定的参数
    public function getParam()
    {
        $parma = $this->form_param[0];
        if (strpos($this->form_param[0], '.')) {//get.cs
            $data = explode('.', $this->form_param[0]);
            $this->form_param[0] = $data[1];//cs
        }
        if (isset($this->form_param[1])) {//是否有默认值
            $data = input($parma, $this->form_param[1]);//接受参数，没有就给默认值
        } else {
            $data = input($parma);//接受参数，没有就给默认值
        }
        return $data;
    }

    /*------------------------------- 参数校验方法 ---------------------------------*/

    //必须有值,如果有设置默认值，就把默认值给了
    public function must($real_param)
    {
        if (empty($real_param) || strlen($real_param) < 1 || $real_param == 'undifend' || $real_param == 'null' || $real_param == 'false' || $real_param == false) {
            if (isset($this->form_param[1]) && !empty($this->form_param[1])) {
                $this->real_param = $this->form_param[1];
                return true;
            }
            return false;
        }
        return true;
    }

    //必须是索引，用于索引id验证
    private function key($real_param)
    {
        if (!is_numeric($real_param) || $real_param < 1 || strpos($real_param, '.') != false) {
            return false;
        }
        return true;
    }

    //判断手否是手机号码
    private function is_mobile($real_param)
    {
        if (preg_match("/^1[3456789]\d{9}$/", $real_param)) {
            return true;
        }
        return false;
    }

    //判断身份证  /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    private function is_id_card($real_param)
    {
        if (preg_match("/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/", $real_param)) {
            return true;
        }
        return false;
    }

    //判断营业执照社会信用代码  /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    private function is_company_credit($real_param)
    {
        if (preg_match("/^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/", $real_param)) {
            return true;
        }
        return false;
    }

    //对邮箱进行判断
    private function is_email($real_param)
    {
        $chars = '/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}$/i';
        if ((strpos($real_param, '@') !== false) && (strpos($real_param, '.') !== false)) {
            if (preg_match($chars, $real_param)) {
                return true;
            }
            return false;
        }
        return false;
    }
}